from typing import Any, List, Optional
from pydantic import Field

from src.agent.mcp import MCPAgent
from src.prompt.big_deal_analysis import BIG_DEAL_SYSTEM_PROMPT
from src.prompt.mcp import NEXT_STEP_PROMPT_ZN
from src.schema import Message
from src.tool import Terminate, ToolCollection
from src.tool.big_deal_analysis import BigDealAnalysisTool


class BigDealAnalysisAgent(MCPAgent):
    """大单异动分析代理：专业的资金流向和大单交易分析师。

    这个代理专门用于分析股票市场中的大单资金异动，包括：
    1. 主力资金流入流出分析
    2. 机构大单交易行为识别
    3. 异常资金活动检测
    4. 资金集中度和散户情绪分析
    5. 基于资金面的投资建议生成

    主要功能：
    - 实时监控大单交易数据
    - 识别异常资金流动模式
    - 分析主力进出场时机
    - 预测资金面对股价的影响
    - 提供精准的交易信号

    适用场景：
    - 短线交易策略制定
    - 主力资金监控
    - 市场情绪判断
    - 风险控制和资金管理
    """

    # 代理基本配置
    name: str = Field(
        default="big_deal_analysis_agent", 
        description="大单异动分析代理名称"
    )
    description: str = Field(
        default="分析市场及个股大单资金异动，为投资决策提供依据",
        description="代理功能描述"
    )

    # 提示词配置
    system_prompt: str = Field(
        default=BIG_DEAL_SYSTEM_PROMPT, 
        description="大单分析专用系统提示词"
    )
    next_step_prompt: str = Field(
        default=NEXT_STEP_PROMPT_ZN, 
        description="中文步骤指导提示词"
    )

    # 工具配置：专业大单分析工具集合
    available_tools: ToolCollection = Field(
        default_factory=lambda: ToolCollection(
            BigDealAnalysisTool(),  # 大单分析核心工具
            Terminate(),            # 任务终止工具
        ),
        description="大单分析专用工具集合"
    )
    
    # 性能优化配置
    max_observe: int = Field(
        default=10000, 
        description="单次观察的最大字符数，防止内存过大导致 LLM 无法响应"
    )
    special_tool_names: List[str] = Field(
        default_factory=lambda: [Terminate().name],
        description="特殊工具名称列表"
    )

    async def run(
        self,
        request: Optional[str] = None,
        stock_code: Optional[str] = None,
    ) -> Any:
        """执行大单异动分析任务。
        
        这个方法提供了灵活的大单分析执行方式，支持直接的股票代码分析
        和自定义分析请求。当只提供股票代码时，会自动生成标准化的分析请求。
        
        Args:
            request: 可选的自定义分析请求，如果提供则覆盖 stock_code 参数
            stock_code: 要分析的股票代码，当 request 为空时使用
            
        Returns:
            Any: 大单异动分析结果，包含资金流向、异动模式和投资建议
            
        Examples:
            >>> agent = BigDealAnalysisAgent()
            >>> result = await agent.run(stock_code="000001")
            >>> result = await agent.run(request="分析平安银行最近的大单活动")
        """
        # 如果提供了股票代码但没有自定义请求，生成标准分析请求
        if stock_code and not request:
            # 添加分析上下文到代理记忆
            self.memory.add_message(
                Message.system_message(
                    f"你正在分析股票 {stock_code} 的大单资金流向。请使用大单分析工具获取数据，"
                    f"综合资金异动与价格走势，识别主力行为模式，给出专业的投资建议。"
                )
            )
            # 生成详细的分析请求
            request = f"请对 {stock_code} 进行全面的大单异动深度分析，包括资金流向、交易模式和投资建议。"

        # 调用父类方法执行分析
        return await super().run(request) 